#pragma once

namespace soy {


class Partitioning;
class RunStyles {
private:
	Partitioning* starts;
	SplitVector<int>* styles;
	int RunFromPosition( int position ) const;
	int SplitRun( int position );
	void RemoveRun( int run );
	void RemoveRunIfEmpty( int run );
	void RemoveRunIfSameAsPrevious( int run );
public:
	RunStyles();
	~RunStyles();
	int Length() const;
	int ValueAt( int position ) const;
	int FindNextChange( int position, int end );
	int StartRun( int position );
	int EndRun( int position );
	// Returns true if some values may have changed
	bool FillRange( int& position, int value, int& fillLength );
	void SetValueAt( int position, int value );
	void InsertSpace( int position, int insertLength );
	void DeleteAll();
	void DeleteRange( int position, int deleteLength );
	int Runs() const;
	bool AllSame() const;
	bool AllSameAs( int value ) const;
	int Find( int value, int start ) const;
};


};
